/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cliente;

import aso.upna.busControl.*;
import aso.upna.exceptions.MediaPlayerNotReady;
import aso.upna.exceptions.NoFileLoaded;
import aso.upna.interfaces.AudioPlayerInterface;
import java.io.File;
import org.gstreamer.*;
import org.gstreamer.elements.PlayBin;

/**
 *
 * @author triki
 */

public class Reproductor implements AudioPlayerInterface {

    private String filename;
    private PlayBin playbin;

    public Reproductor()
    {
        startUpAudioPlayer();
    }
    
    public Reproductor(String filename)
    {
        this.filename = new String(filename);
        startUpAudioPlayer();
    }

    private void startUpAudioPlayer()
    {
         String[] args = new String[1];
         args[0] = "";
         args = Gst.init("AudioPlayer", args);

        buildAudioPlayer();
        setFileName();

        //Ponemos el reproductor configurado en A LA ESPERA.
        playbin.setState(State.READY);
    }

    private void buildAudioPlayer()
    {
        playbin = new PlayBin("Mp3AudioPlayer");

        //Añadimos los listeners al bus. Los listener nos avisaran de los mensajes
        //introducidos en el Bus.

        //Añadimos un listener para cuando finaliza el stream.
        playbin.getBus().connect(new EndStream(playbin));
        
        //Añadimos un listener para obtener el tag del fichero MP3. -> Implementar en una clase
        playbin.getBus().connect(new TagEvent());

        //Añadimos un listener para los errores -> Implementar en una clase
        playbin.getBus().connect(new BusError());

        //Indicamos al Bus que lo vacie automaticamente. No es necesario.
        playbin.getBus().setFlushing(true);
    }

    //Metodo principal. Carga en la pipe el fichero expecificado como
    //argumento en la construccion de la clase.

    private void setFileName()
    {
        playbin.setInputFile(new File(this.filename));
        System.out.println("Fichero Cargado");
    }

    //Metodo sobre cargado. Permite cargar otro fichero distinto al pasado
    //como argumento en el constructor. Muy util para cargar un segundo fichero.
    //para futuras reproducciones de audio.

    public void setFileName(String filename) throws NoFileLoaded
    {
        if(filename == null)
            throw new NoFileLoaded();
        else
        {
            this.filename = new String(filename);

            //Cargamos el fichero a reproducir.
            playbin.setInputFile(new File(this.filename));
            System.out.println("Fichero Cargado");
        }
    }

     public String getCurrentPosition()
     {
         if(playbin.isPlaying())
            return playbin.queryPosition().toString();
         else
            return null;
     }

    public String getCurrentDuration()
    {
        if(playbin.isPlaying())
        {
            System.out.println("tiempo (duracion): "+playbin.queryDuration().toString());
            return playbin.queryDuration().toString();
        }
        else
            return null;
    }

    //Empieza o reanuda la cancion
    public void play() throws MediaPlayerNotReady {
        playbin.setState(State.PLAYING);
        System.out.println("> Playing...");
    }

    //Pone en pausa el stream
    public void pause() throws MediaPlayerNotReady {
        playbin.setState(State.PAUSED);
        System.out.println("> Audio Paused.");
    }

    //Para el stream actual
    public void stop() throws MediaPlayerNotReady {
        //Paramos la musica.
        playbin.setState(State.NULL);
        Gst.quit();
        System.out.println("Musica Parada");
    }

}
